{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "0b9ffbb2-8d33-eb0c-5a42-0733bdc3b74b",
    "_uuid": "e14f65723f5ac826104e861c45e58525740d8b2a"
   },
   "source": [
    "# Bike Sharing 数据集上的回归分析\n",
    "\n",
    "1、 任务描述 请在Capital Bikeshare （美国Washington, D.C.的一个共享单车公司）提供的自行车数据上进行回归分析。训练数据为2011年的数据，要求预测2012年每天的单车共享数量。\n",
    "\n",
    "原始数据集地址：http://archive.ics.uci.edu/ml/datasets/Bike+Sharing+Dataset 1) 文件说明 \n",
    "day.csv: 按天计的单车共享次数（作业只需使用该文件） \n",
    "hour.csv: 按小时计的单车共享次数（无需理会） \n",
    "readme：数据说明文件\n",
    "\n",
    "2) 字段说明 \n",
    "Instant记录号 \n",
    "Dteday：日期 \n",
    "Season：季节（1=春天、2=夏天、3=秋天、4=冬天） \n",
    "yr：年份，(0: 2011, 1:2012) \n",
    "mnth：月份( 1 to 12) \n",
    "hr：小时 (0 to 23) （只在hour.csv有，作业忽略此字段） \n",
    "holiday：是否是节假日 \n",
    "weekday：星期中的哪天，取值为0～6 \n",
    "workingday：是否工作日 1=工作日 （是否为工作日，1为工作日，0为非周末或节假日 weathersit：天气（1：晴天，多云 ",
    "2：雾天，阴天 ",
    "3：小雪，小雨 ",
    "4：大雨，大雪，大雾） temp：气温摄氏度 \n",
    "atemp：体感温度 \n",
    "hum：湿度 \n",
    "windspeed：风速 \n",
    "\n",
    "casual：非注册用户个数 \n",
    "registered：注册用户个数 \n",
    "cnt：给定日期（天）时间（每小时）总租车人数，响应变量y\n",
    "casual、registered和cnt三个特征均为要预测的y，作业里只需对cnt进行预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "_cell_guid": "2ba3154a-c2aa-3158-1984-63ad2c0c786a",
    "_uuid": "5eb696b95780825e94ddb49787f9fa339fc3833b",
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 导入必要的工具包\n",
    "# 数据读取及基本处理\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "#模型\n",
    "from sklearn.linear_model import LinearRegression, RidgeCV, LassoCV, ElasticNetCV\n",
    "\n",
    "#模型评估\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.metrics import r2_score  #评价回归预测模型的性能\n",
    "\n",
    "#可视化\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "_cell_guid": "21fa35be-878b-b4f2-ef6e-68dc070b8bfa",
    "_uuid": "73aee228226be55c0c8a6e4fcbf818c56cd94926"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>season_1</th>\n",
       "      <th>season_2</th>\n",
       "      <th>season_3</th>\n",
       "      <th>season_4</th>\n",
       "      <th>mnth_1</th>\n",
       "      <th>mnth_2</th>\n",
       "      <th>mnth_3</th>\n",
       "      <th>mnth_4</th>\n",
       "      <th>mnth_5</th>\n",
       "      <th>...</th>\n",
       "      <th>weekday_5</th>\n",
       "      <th>weekday_6</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>holiday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>yr</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.355170</td>\n",
       "      <td>0.373517</td>\n",
       "      <td>0.828620</td>\n",
       "      <td>0.284606</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>985</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.379232</td>\n",
       "      <td>0.360541</td>\n",
       "      <td>0.715771</td>\n",
       "      <td>0.466215</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.171000</td>\n",
       "      <td>0.144830</td>\n",
       "      <td>0.449638</td>\n",
       "      <td>0.465740</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.175530</td>\n",
       "      <td>0.174649</td>\n",
       "      <td>0.607131</td>\n",
       "      <td>0.284297</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.209120</td>\n",
       "      <td>0.197158</td>\n",
       "      <td>0.449313</td>\n",
       "      <td>0.339143</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 35 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   instant  season_1  season_2  season_3  season_4  mnth_1  mnth_2  mnth_3  \\\n",
       "0        1         1         0         0         0       1       0       0   \n",
       "1        2         1         0         0         0       1       0       0   \n",
       "2        3         1         0         0         0       1       0       0   \n",
       "3        4         1         0         0         0       1       0       0   \n",
       "4        5         1         0         0         0       1       0       0   \n",
       "\n",
       "   mnth_4  mnth_5  ...   weekday_5  weekday_6      temp     atemp       hum  \\\n",
       "0       0       0  ...           0          1  0.355170  0.373517  0.828620   \n",
       "1       0       0  ...           0          0  0.379232  0.360541  0.715771   \n",
       "2       0       0  ...           0          0  0.171000  0.144830  0.449638   \n",
       "3       0       0  ...           0          0  0.175530  0.174649  0.607131   \n",
       "4       0       0  ...           0          0  0.209120  0.197158  0.449313   \n",
       "\n",
       "   windspeed  holiday  workingday  yr   cnt  \n",
       "0   0.284606        0           0   0   985  \n",
       "1   0.466215        0           0   0   801  \n",
       "2   0.465740        0           1   0  1349  \n",
       "3   0.284297        0           1   0  1562  \n",
       "4   0.339143        0           1   0  1600  \n",
       "\n",
       "[5 rows x 35 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读入数据\n",
    "data = pd.read_csv(\"FE_day.csv\")\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "a1ae46d1-8787-67a3-2f69-6497c97320eb",
    "_uuid": "16fa6600f9877c9607060f9e50de6eaa9bc1c766"
   },
   "source": [
    "**准备训练数据**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/qing/anaconda2/lib/python2.7/site-packages/ipykernel_launcher.py:11: FutureWarning: reshape is deprecated and will raise in a subsequent release. Please use .values.reshape(...) instead\n",
      "  # This is added back by InteractiveShellApp.init_path()\n",
      "/Users/qing/anaconda2/lib/python2.7/site-packages/sklearn/utils/validation.py:475: DataConversionWarning: Data with input dtype int64 was converted to float64 by StandardScaler.\n",
      "  warnings.warn(msg, DataConversionWarning)\n"
     ]
    }
   ],
   "source": [
    "# get labels\n",
    "y = data['cnt']   \n",
    "X = data.drop(['cnt'], axis=1)\n",
    "\n",
    "#对y做标准化不是必须\n",
    "#对y标准化的好处是不同问题的w差异不太大，同时正则参数的范围也有限\n",
    "#ss_y需要保存，生产提交结果时反变换还需要\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "ss_y = StandardScaler()\n",
    "y = ss_y.fit_transform(y.reshape(-1, 1))\n",
    "y = y.flatten()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('train samples:', (584, 34))\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/qing/anaconda2/lib/python2.7/site-packages/sklearn/model_selection/_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 用train_test_split 分割训练数据和测试数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.8,random_state = 0)\n",
    "\n",
    "print(\"train samples:\" ,X_train.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/qing/anaconda2/lib/python2.7/site-packages/ipykernel_launcher.py:5: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  \"\"\"\n",
      "/Users/qing/anaconda2/lib/python2.7/site-packages/ipykernel_launcher.py:6: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  \n"
     ]
    }
   ],
   "source": [
    "#保存测试ID，用于结果提交\n",
    "testID = X_test['instant']\n",
    "\n",
    "#ID不参与预测\n",
    "X_train.drop(['instant'], axis=1, inplace = True)\n",
    "X_test.drop(['instant'], axis=1, inplace = True)\n",
    "\n",
    "#保存特征名字以备后用（可视化）\n",
    "feat_names = X_train.columns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "9fe1c63e-3803-feac-362c-631399fdb8ec",
    "_uuid": "431749cca6d8fbbc2d1d3732baeb6d63590c6e2e"
   },
   "source": [
    "**1* Linear Regression without regularization**\n",
    "最小二乘线性回归\n",
    "最小二乘没有超参数需要调优，直接用全体训练数据训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "_cell_guid": "101cf15a-9006-ac9a-8abe-756371fd8b1a",
    "_uuid": "38562579d6306877a067189f25ce15ececbe99d2",
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('RMSE on Training set :', 0.3885924259566297)\n",
      "('RMSE on Test set :', 0.4058083648682148)\n",
      "('r2_score on Training set :', 0.8436713372252476)\n",
      "('r2_score on Test set :', 0.8548919315749763)\n"
     ]
    }
   ],
   "source": [
    "# Linear Regression\n",
    "# 1. 生成学习器实例\n",
    "lr = LinearRegression()\n",
    "\n",
    "#2. 在训练集上训练学习器\n",
    "lr.fit(X_train, y_train)\n",
    "\n",
    "#3.用训练好的学习器对训练集/测试集进行预测\n",
    "y_train_pred = lr.predict(X_train)\n",
    "y_test_pred = lr.predict(X_test)\n",
    "\n",
    "\n",
    "rmse_train = np.sqrt(mean_squared_error(y_train,y_train_pred))\n",
    "rmse_test = np.sqrt(mean_squared_error(y_test,y_test_pred))\n",
    "print(\"RMSE on Training set :\", rmse_train)\n",
    "print(\"RMSE on Test set :\", rmse_test)\n",
    "\n",
    "r2_score_train = r2_score(y_train,y_train_pred)\n",
    "r2_score_test = r2_score(y_test,y_test_pred)\n",
    "print(\"r2_score on Training set :\", r2_score_train)\n",
    "print(\"r2_score on Test set :\", r2_score_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ridge picked 33 features and eliminated the other 0 features\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a0c1cf4d0>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot important coefficients\n",
    "coefs = pd.Series(lr.coef_, index = feat_names)\n",
    "print(\"Ridge picked \" + str(sum(coefs != 0)) + \" features and eliminated the other \" +  \\\n",
    "      str(sum(coefs == 0)) + \" features\")\n",
    "\n",
    "#正系数值最大的10个特征和负系数值最小（绝对值大）的10个特征\n",
    "imp_coefs = pd.concat([coefs.sort_values().head(10),\n",
    "                     coefs.sort_values().tail(10)])\n",
    "imp_coefs.plot(kind = \"barh\")\n",
    "plt.title(\"Coefficients in the OLS Model\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "系数的值非常大。由于特征之间强相关，OLS模型的性能并不好"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "a70803d8-638c-bdfa-6897-aed8ce78f475",
    "_uuid": "2938aee78a9f61d6ca59345d6fa0793e2422f34c"
   },
   "source": [
    "**2* Linear Regression with Ridge regularization (L2 penalty)**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('Best alpha :', 1.0)\n",
      "('cv of rmse :', array([0.41582484, 0.41379631, 0.41219016, 0.42469386, 0.55687265,\n",
      "       0.86786002]))\n",
      "('RMSE on Training set :', 0.38950469163446516)\n",
      "('RMSE on Test set :', 0.40135389084208606)\n",
      "('r2_score on Training set :', 0.8429364764067981)\n",
      "('r2_score on Test set :', 0.8580600896877567)\n"
     ]
    }
   ],
   "source": [
    "#RidgeCV缺省的score是mean squared errors \n",
    "# 1. 设置超参数搜索范围，生成学习器实例\n",
    "# RidgeCV(alphas=(0.1, 1.0, 10.0), fit_intercept=True, normalize=False, scoring=None, cv=None, gcv_mode=None, store_cv_values=False)\n",
    "alphas = [0.01, 0.1, 1, 10, 100, 1000]\n",
    "ridge = RidgeCV(alphas = alphas,store_cv_values=True )\n",
    "\n",
    "# 2. 用训练数据度模型进行训练\n",
    "# RidgeCV采用的是广义交叉验证（Generalized Cross-Validation），留一交叉验证（N-折交叉验证）的一种有效实现方式\n",
    "ridge.fit(X_train, y_train)\n",
    "\n",
    "#通过交叉验证得到的最佳超参数alpha\n",
    "alpha = ridge.alpha_\n",
    "print(\"Best alpha :\", alpha)\n",
    "\n",
    "# 交叉验证估计的测试误差\n",
    "mse_cv = np.mean(ridge.cv_values_, axis = 0)\n",
    "rmse_cv = np.sqrt(mse_cv)\n",
    "print(\"cv of rmse :\",rmse_cv)\n",
    "\n",
    "#训练上测试，训练误差，实际任务中这一步不需要\n",
    "y_train_pred = ridge.predict(X_train)\n",
    "rmse_train = np.sqrt(mean_squared_error(y_train,y_train_pred))\n",
    "\n",
    "y_test_pred = ridge.predict(X_test)\n",
    "rmse_test = np.sqrt(mean_squared_error(y_test,y_test_pred))\n",
    "\n",
    "print(\"RMSE on Training set :\", rmse_train)\n",
    "print(\"RMSE on Test set :\" ,rmse_test)\n",
    "\n",
    "r2_score_train = r2_score(y_train,y_train_pred)\n",
    "r2_score_test = r2_score(y_test,y_test_pred)\n",
    "print(\"r2_score on Training set :\" ,r2_score_train)\n",
    "print(\"r2_score on Test set :\" ,r2_score_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "_cell_guid": "1fb3f0d6-a070-9ce5-7cc3-01a7e26faa4f",
    "_uuid": "659084128a0ef75a5936912a5f64134774b29664",
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ridge picked 33 features and eliminated the other 0 features\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a0ce51ed0>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a17c06450>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot important coefficients\n",
    "weight = lr.coef_.flatten().T\n",
    "coefs = pd.Series(list(weight), index = feat_names)\n",
    "coefs = pd.Series(ridge.coef_, index = feat_names)\n",
    "print(\"Ridge picked \" + str(sum(coefs != 0)) + \" features and eliminated the other \" +  \\\n",
    "      str(sum(coefs == 0)) + \" features\")\n",
    "\n",
    "#正系数值最大的10个特征和负系数值最小（绝对值大）的10个特征\n",
    "imp_coefs = pd.concat([coefs.sort_values().head(10),\n",
    "                     coefs.sort_values().tail(10)])\n",
    "imp_coefs.plot(kind = \"barh\")\n",
    "plt.title(\"Coefficients in the Ridge Model\")\n",
    "plt.show()\n",
    "\n",
    "mse_mean = np.mean(ridge.cv_values_, axis = 0)\n",
    "plt.plot(np.log10(alphas), mse_mean.reshape(len(alphas),1)) \n",
    "\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "season_1       -0.422001\n",
       "season_2        0.031737\n",
       "season_3        0.050171\n",
       "season_4        0.340094\n",
       "mnth_1         -0.198671\n",
       "mnth_2         -0.131929\n",
       "mnth_3          0.095850\n",
       "mnth_4         -0.003106\n",
       "mnth_5          0.226007\n",
       "mnth_6          0.053810\n",
       "mnth_7         -0.159091\n",
       "mnth_8          0.066818\n",
       "mnth_9          0.346508\n",
       "mnth_10         0.121637\n",
       "mnth_11        -0.221136\n",
       "mnth_12        -0.196697\n",
       "weathersit_1    0.391182\n",
       "weathersit_2    0.176635\n",
       "weathersit_3   -0.567818\n",
       "weekday_0      -0.086224\n",
       "weekday_1      -0.080506\n",
       "weekday_2      -0.024855\n",
       "weekday_3      -0.002459\n",
       "weekday_4       0.033213\n",
       "weekday_5       0.045171\n",
       "weekday_6       0.115660\n",
       "temp            0.977490\n",
       "atemp           0.829258\n",
       "hum            -0.785552\n",
       "windspeed      -0.690416\n",
       "holiday        -0.104650\n",
       "workingday      0.075214\n",
       "yr              1.008494\n",
       "dtype: float64"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coefs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "相比OLS，岭回归模型增加了L2正则，系数值进行了收缩。\n",
    "由于增加正则限制了模型复杂的，相比比OLS模型，岭回归模型在训练集上的误差略有增大，但在测试集上的误差有所减小。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "2da33461-fb1a-c09a-b0fe-d20e8c8f52e3",
    "_uuid": "d2e8bab153344d6ecf2e48909b76bd8f387e2710"
   },
   "source": [
    "**3* Linear Regression with Lasso regularization (L1 penalty)**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "_cell_guid": "8525724a-fb77-66d4-e06f-f3365fbd8ec3",
    "_uuid": "f8f41944e405693ba867158353ffedcd9ecd4a07",
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('Best alpha :', 0.0012069167394253683)\n",
      "('cv of rmse :', 0.42799785980860977)\n",
      "Lasso picked 27 features and eliminated the other 6 features\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a0cfc7210>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a0d0b7250>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('RMSE on Training set :', 0.38962296575467253)\n",
      "('RMSE on Test set :', 0.4063374994232661)\n",
      "('r2_score on Training set :', 0.8428410764238057)\n",
      "('r2_score on Test set :', 0.8545132713116892)\n"
     ]
    }
   ],
   "source": [
    "# 3* Lasso\n",
    "#1. 生成学习器实例，LassoCV默认参数可自动确定alpha的搜素范围\n",
    "lasso = LassoCV()\n",
    "\n",
    "#2.模型训练\n",
    "lasso.fit(X_train, y_train)\n",
    "alpha = lasso.alpha_\n",
    "print(\"Best alpha :\" , alpha)\n",
    "\n",
    "#3. 模型性能：cv\n",
    "mse_cv = np.mean(lasso.mse_path_, axis = 1)\n",
    "rmse_cv = np.sqrt(mse_cv)\n",
    "print(\"cv of rmse :\", min(rmse_cv))\n",
    "\n",
    "# 4. 特征重要性\n",
    "#Plot important coefficients\n",
    "coefs = pd.Series(lasso.coef_, index = feat_names)\n",
    "print(\"Lasso picked \" + str(sum(coefs != 0)) + \" features and eliminated the other \" +  \\\n",
    "      str(sum(coefs == 0)) + \" features\")\n",
    "imp_coefs = pd.concat([coefs.sort_values().head(10),\n",
    "                     coefs.sort_values().tail(10)])\n",
    "imp_coefs.plot(kind = \"barh\")\n",
    "plt.title(\"Coefficients in the Lasso Model\")\n",
    "plt.show()\n",
    "\n",
    "#5. 显示不同alpha对应的模型性能\n",
    "plt.plot(np.log10(lasso.alphas_), mse_cv) \n",
    "\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show() \n",
    "\n",
    "#训练误差\n",
    "y_train_pred = lasso.predict(X_train)\n",
    "rmse_train = np.sqrt(mean_squared_error(y_train,y_train_pred))\n",
    "print(\"RMSE on Training set :\" ,rmse_train)\n",
    "\n",
    "#测试误差\n",
    "y_test_pred = lasso.predict(X_test)\n",
    "rmse_test = np.sqrt(mean_squared_error(y_test,y_test_pred))\n",
    "print(\"RMSE on Test set :\" ,rmse_test)\n",
    "\n",
    "r2_score_train = r2_score(y_train,y_train_pred)\n",
    "r2_score_test = r2_score(y_test,y_test_pred)\n",
    "print(\"r2_score on Training set :\" , r2_score_train)\n",
    "print(\"r2_score on Test set :\" , r2_score_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "season_1       -0.512357\n",
       "season_2       -0.000000\n",
       "season_3        0.000000\n",
       "season_4        0.231491\n",
       "mnth_1         -0.078702\n",
       "mnth_2         -0.024112\n",
       "mnth_3          0.140707\n",
       "mnth_4         -0.000000\n",
       "mnth_5          0.188145\n",
       "mnth_6          0.000000\n",
       "mnth_7         -0.204440\n",
       "mnth_8          0.005571\n",
       "mnth_9          0.331305\n",
       "mnth_10         0.182090\n",
       "mnth_11        -0.108358\n",
       "mnth_12        -0.079312\n",
       "weathersit_1    0.200497\n",
       "weathersit_2   -0.000000\n",
       "weathersit_3   -0.738619\n",
       "weekday_0      -0.141341\n",
       "weekday_1      -0.069356\n",
       "weekday_2      -0.011756\n",
       "weekday_3      -0.000000\n",
       "weekday_4       0.024312\n",
       "weekday_5       0.039942\n",
       "weekday_6       0.042472\n",
       "temp            1.531392\n",
       "atemp           0.446259\n",
       "hum            -0.836293\n",
       "windspeed      -0.713962\n",
       "holiday        -0.155788\n",
       "workingday      0.000718\n",
       "yr              1.002915\n",
       "dtype: float64"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coefs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lasso模型增加了L1正则，系数值进行了收缩，同时有些特征的系数为0。\n",
    "在这个例子中，岭回归模型比Lasso模型性能稍好。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 对测试集进行测试，生成提交文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_test_pred = ridge.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.03089798,  0.10834997, -1.5926679 , -1.77426921, -0.44036681,\n",
       "       -1.4647203 , -0.31223198,  0.65651016,  0.7532931 , -1.83967809,\n",
       "       -1.57577263, -1.71422556, -1.69101713,  0.16168839,  0.10579351,\n",
       "       -0.33658084,  1.15128245,  0.74256847, -0.61942159, -0.92832745,\n",
       "        1.41883294, -0.72156948,  0.31103451, -0.09356889, -1.26542205,\n",
       "        0.75855101,  0.50210203,  0.2535162 ,  1.32352523,  1.02780116,\n",
       "       -2.07750251,  0.45445206,  0.64118456,  0.27802347, -1.37701084,\n",
       "       -0.29520552,  1.07165508,  1.51094989, -0.85059155, -0.83379598,\n",
       "        0.68307276, -1.80937999,  0.56098671, -0.42945272,  1.25064698,\n",
       "        1.46252789, -0.76703295, -0.24276303, -0.62859612, -1.05344098,\n",
       "        1.06269397,  0.99093532,  0.37645123,  0.87235074, -0.09288723,\n",
       "       -0.57303067, -0.75471952,  1.08445966,  0.97153924, -0.28500484,\n",
       "        0.78636861, -0.1238979 ,  0.60187342,  1.34229884,  1.07445316,\n",
       "       -0.84593392,  0.47061237,  0.11773177,  1.25035233,  0.58152244,\n",
       "        0.83343859,  1.02583399,  0.01897923,  0.87334692, -0.18359322,\n",
       "        0.65217028,  0.37612934,  1.28491938, -0.90010024, -0.82194797,\n",
       "        0.36339622,  0.31172219,  0.33556169, -1.43772115,  0.22762713,\n",
       "        1.11846935,  0.43199581,  0.97162347, -0.42177935, -0.33697799,\n",
       "       -1.89842649, -1.4554186 ,  1.27351927,  1.12514893,  0.6030888 ,\n",
       "       -0.91227927, -1.83659236,  1.40355288,  0.08272856, -0.35894605,\n",
       "       -0.08501802,  0.58919718,  0.11929659,  1.14034124, -0.61067179,\n",
       "        0.15809607,  1.44952612,  1.40208606,  0.11812228, -1.58100908,\n",
       "       -0.69123363, -0.1758808 ,  0.0223951 , -1.19979026, -1.68903734,\n",
       "        0.12553437,  0.31968837, -0.37222481,  0.98732597,  0.37434668,\n",
       "       -1.35850082,  0.20882495, -0.83494891, -0.47144301, -0.48735054,\n",
       "        0.25613757, -1.77708897,  0.56763025, -0.62790199, -0.52712926,\n",
       "       -1.82390607,  1.03178703, -1.62403006, -0.01468539, -0.40914155,\n",
       "        0.30147918,  0.78410721, -0.15072768,  0.36916937,  0.35083152,\n",
       "        0.42779607, -0.19888701,  0.50469078,  0.14257598,  0.3330679 ,\n",
       "        1.44204323, -0.08980429])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_test_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "#y_test_pred = ridge.predict(X_test)\n",
    "\n",
    "#对模型预测结果进行标准化变换的反变换\n",
    "mean = ss_y.mean_\n",
    "scale = ss_y.scale_\n",
    "y_test_pred = y_test_pred*scale + mean\n",
    "\n",
    "#生成提交测试结果\n",
    "df = pd.DataFrame({\"instant\":testID, 'cnt':y_test_pred})\n",
    "df.to_csv('submission.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>cnt</th>\n",
       "      <th>instant</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>196</th>\n",
       "      <td>4444.533866</td>\n",
       "      <td>197</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>187</th>\n",
       "      <td>4714.102025</td>\n",
       "      <td>188</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>1421.125422</td>\n",
       "      <td>15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>1069.565993</td>\n",
       "      <td>32</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>390</th>\n",
       "      <td>3651.848907</td>\n",
       "      <td>391</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>319</th>\n",
       "      <td>1668.817376</td>\n",
       "      <td>320</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>299</th>\n",
       "      <td>3899.903336</td>\n",
       "      <td>300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>702</th>\n",
       "      <td>5775.277635</td>\n",
       "      <td>703</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>462</th>\n",
       "      <td>5962.638371</td>\n",
       "      <td>463</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>942.941863</td>\n",
       "      <td>28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>1453.832735</td>\n",
       "      <td>41</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>360</th>\n",
       "      <td>1185.803650</td>\n",
       "      <td>361</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>55</th>\n",
       "      <td>1230.732523</td>\n",
       "      <td>56</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>157</th>\n",
       "      <td>4817.359123</td>\n",
       "      <td>158</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>193</th>\n",
       "      <td>4709.153005</td>\n",
       "      <td>194</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>170</th>\n",
       "      <td>3852.766707</td>\n",
       "      <td>171</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>618</th>\n",
       "      <td>6733.100366</td>\n",
       "      <td>619</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>679</th>\n",
       "      <td>5941.876706</td>\n",
       "      <td>680</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>382</th>\n",
       "      <td>3305.219278</td>\n",
       "      <td>383</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>79</th>\n",
       "      <td>2707.212759</td>\n",
       "      <td>80</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>607</th>\n",
       "      <td>7251.047599</td>\n",
       "      <td>608</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>728</th>\n",
       "      <td>3107.472612</td>\n",
       "      <td>729</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>674</th>\n",
       "      <td>5106.476176</td>\n",
       "      <td>675</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>162</th>\n",
       "      <td>4323.210141</td>\n",
       "      <td>163</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>386</th>\n",
       "      <td>2054.636072</td>\n",
       "      <td>387</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>596</th>\n",
       "      <td>5972.817092</td>\n",
       "      <td>597</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>202</th>\n",
       "      <td>5476.361105</td>\n",
       "      <td>203</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>242</th>\n",
       "      <td>4995.127286</td>\n",
       "      <td>243</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>631</th>\n",
       "      <td>7066.542738</td>\n",
       "      <td>632</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>518</th>\n",
       "      <td>6494.054663</td>\n",
       "      <td>519</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>122</th>\n",
       "      <td>3783.764059</td>\n",
       "      <td>123</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>663</th>\n",
       "      <td>6415.699312</td>\n",
       "      <td>664</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>457</th>\n",
       "      <td>5229.041309</td>\n",
       "      <td>458</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>1874.446169</td>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>172</th>\n",
       "      <td>4908.610121</td>\n",
       "      <td>173</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>48</th>\n",
       "      <td>2887.982974</td>\n",
       "      <td>49</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>365</th>\n",
       "      <td>3591.688926</td>\n",
       "      <td>366</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>318</th>\n",
       "      <td>3560.893779</td>\n",
       "      <td>319</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>268</th>\n",
       "      <td>5000.201967</td>\n",
       "      <td>269</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>1064.107261</td>\n",
       "      <td>19</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>521</th>\n",
       "      <td>5603.216269</td>\n",
       "      <td>522</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>415</th>\n",
       "      <td>3288.802192</td>\n",
       "      <td>416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>76</th>\n",
       "      <td>3483.886715</td>\n",
       "      <td>77</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>64</th>\n",
       "      <td>973.474698</td>\n",
       "      <td>65</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>582</th>\n",
       "      <td>6501.770857</td>\n",
       "      <td>583</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>1360.411842</td>\n",
       "      <td>53</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>293</th>\n",
       "      <td>4475.919602</td>\n",
       "      <td>294</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>389</th>\n",
       "      <td>3712.297464</td>\n",
       "      <td>390</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>443</th>\n",
       "      <td>5087.978151</td>\n",
       "      <td>444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>470</th>\n",
       "      <td>6022.290978</td>\n",
       "      <td>471</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>261</th>\n",
       "      <td>4212.557246</td>\n",
       "      <td>262</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>279</th>\n",
       "      <td>5219.018637</td>\n",
       "      <td>280</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>252</th>\n",
       "      <td>5183.518652</td>\n",
       "      <td>253</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>483</th>\n",
       "      <td>5332.513237</td>\n",
       "      <td>484</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>118</th>\n",
       "      <td>4119.326262</td>\n",
       "      <td>119</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>566</th>\n",
       "      <td>5481.372628</td>\n",
       "      <td>567</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>688</th>\n",
       "      <td>4780.359670</td>\n",
       "      <td>689</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>266</th>\n",
       "      <td>5149.130305</td>\n",
       "      <td>267</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>504</th>\n",
       "      <td>7295.980083</td>\n",
       "      <td>505</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>239</th>\n",
       "      <td>4330.497972</td>\n",
       "      <td>240</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>147 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "             cnt  instant\n",
       "196  4444.533866      197\n",
       "187  4714.102025      188\n",
       "14   1421.125422       15\n",
       "31   1069.565993       32\n",
       "390  3651.848907      391\n",
       "319  1668.817376      320\n",
       "299  3899.903336      300\n",
       "702  5775.277635      703\n",
       "462  5962.638371      463\n",
       "27    942.941863       28\n",
       "40   1453.832735       41\n",
       "360  1185.803650      361\n",
       "55   1230.732523       56\n",
       "157  4817.359123      158\n",
       "193  4709.153005      194\n",
       "170  3852.766707      171\n",
       "618  6733.100366      619\n",
       "679  5941.876706      680\n",
       "382  3305.219278      383\n",
       "79   2707.212759       80\n",
       "607  7251.047599      608\n",
       "728  3107.472612      729\n",
       "674  5106.476176      675\n",
       "162  4323.210141      163\n",
       "386  2054.636072      387\n",
       "596  5972.817092      597\n",
       "202  5476.361105      203\n",
       "242  4995.127286      243\n",
       "631  7066.542738      632\n",
       "518  6494.054663      519\n",
       "..           ...      ...\n",
       "122  3783.764059      123\n",
       "663  6415.699312      664\n",
       "457  5229.041309      458\n",
       "37   1874.446169       38\n",
       "172  4908.610121      173\n",
       "48   2887.982974       49\n",
       "365  3591.688926      366\n",
       "318  3560.893779      319\n",
       "268  5000.201967      269\n",
       "18   1064.107261       19\n",
       "521  5603.216269      522\n",
       "415  3288.802192      416\n",
       "76   3483.886715       77\n",
       "64    973.474698       65\n",
       "582  6501.770857      583\n",
       "52   1360.411842       53\n",
       "293  4475.919602      294\n",
       "389  3712.297464      390\n",
       "443  5087.978151      444\n",
       "470  6022.290978      471\n",
       "261  4212.557246      262\n",
       "279  5219.018637      280\n",
       "252  5183.518652      253\n",
       "483  5332.513237      484\n",
       "118  4119.326262      119\n",
       "566  5481.372628      567\n",
       "688  4780.359670      689\n",
       "266  5149.130305      267\n",
       "504  7295.980083      505\n",
       "239  4330.497972      240\n",
       "\n",
       "[147 rows x 2 columns]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "_change_revision": 0,
  "_is_fork": false,
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
